package event

import (
	"errors"
	"fmt"
	"time"
	"yunj/pkg/global"
	"yunj/pkg/yunj/core/builder"
	"yunj/pkg/yunj/core/event"
)

// 事件订阅
var Subscribes = map[string][]*event.Listener{
	// 测试事件
	"test": {
		&event.Listener{
			Id: "listener_1",
			Handler: func(p any) error {
				fmt.Printf("测试事件订阅方法1 start参数：%v \r\n", p)
				time.Sleep(4 * time.Second)
				fmt.Printf("测试事件订阅方法1 end参数：%v \r\n", p)
				return nil
			},
			IsAsync: false,
		},
		&event.Listener{
			Id: "listener_2",
			Handler: func(p any) error {
				fmt.Printf("测试事件订阅方法2 start参数：%v \r\n", p)
				time.Sleep(3 * time.Second)
				fmt.Printf("测试事件订阅方法2 end参数：%v \r\n", p)
				return nil
			},
			IsAsync: true,
		},
		&event.Listener{
			Id: "listener_3",
			Handler: func(p any) error {
				fmt.Printf("测试事件订阅方法3 start参数：%v \r\n", p)
				time.Sleep(2 * time.Second)
				fmt.Printf("测试事件订阅方法3 end参数：%v \r\n", p)
				return nil
			},
			IsAsync: false,
			Timeout: 1 * time.Second,
		},
	},
	// 表单构建器提交前事件
	"form.builder.submit.before": {
		&event.Listener{
			Id: "listener_1",
			Handler: func(p any) (err error) {
				_, ok := p.(builder.FormSubmitBeforeEventData)
				if !ok {
					err = errors.New("无效表单构建器提交前事件数据")
					return
				}
				// 判断当前是否demo
				if global.Config.App.IsDemo {
					err = errors.New("当前示例数据不可修改！")
					return
				}
				return
			},
			IsAsync: false,
		},
	},
	// 表格构建器异步事件处理前的事件
	"table.builder.event.before": {
		&event.Listener{
			Id: "listener_1",
			Handler: func(p any) (err error) {
				_, ok := p.(builder.TableEventHandleBeforeEventData)
				if !ok {
					err = errors.New("无效表格构建器异步事件处理前的事件数据")
					return
				}
				// 判断当前是否demo
				if global.Config.App.IsDemo {
					err = errors.New("当前示例数据不可修改！")
					return
				}
				return
			},
			IsAsync: false,
		},
	},
}
